梦入琼楼寒有月,行过石树冻无烟

Swap Exact

在 Etherscan 和 Bcanscan 中,作为区块链开发,主要关注的点是交易数据中的 Tokens Transferred 参数项来理解本次交易过程是干什么的,通常在 Bcanscan 的 Input Data 内,都是已经帮助我们解析完成的,在 web 3.0 中,主要通过 Contranct Factions 即 “合约工厂” 来进行创建一个合约对象。

swapExactTokensForTokens 以Token为基准互换为 Tokens


Binance Transaction Hash (Txhash) Details | BscScan 这一份交易中,特别是 Input DataTokens Transferred: 栏的信息内,这一交易主要是通过 0xf… 钱包将≈154.15$的Binace-Pag(在池子中可能名字为 ESC-US) 放入到 PancakeSwap 转换池中。

然后池子将 ≈154.15 的 BSC-US 兑换 17.8637… FistToken 发送到 0xf87… 钱包内。可以看出这一交易主要是将 BSC-US 转换为 FIST。

对于这个方法我们可以通过直译的方式来进行理解,“为 Tokens 转换确切的代币”,结合 Tokens Transferred 中的数据再配合中文直译来进行理解。之后在 web3.0 中,主要通过 eth.contrace 来解析合约工厂:

1
2
3
4
5
@staticmethod
def get_router_contract(web3):
pan_router_contract_address = ''
router_abi = ['']
return web3.eth.contrace(address=pan_router_contract_address, abi=router_abi)
1
为了使整体项目目录和 Code 更加美观,通过 flask 框架,我们可以将上述基础类方法写在 ```Helper.py``` 内,之后我们在 ```main.py``` 启动类引用即可。
方法中包含的参数主要有六个参数,分别体现了该合约方法的主要用处:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

| Id | Name | Info | type |
| --- | --- | --- | --- |
| 1 | amountin | 金额,要发送的 token 数量 | unint |
| 2 | amountOutMin | 最小金额,为了使交易不被逆转,所必须受到的最小输出代币量 | unint |
| 3 | path | 一个目标地址池(流动池必须存在,且拥有流动性, ```path.length > 2```) | address[]calldata |
| 4 | to | token 的接收者 | address |
| 5 | deadline | Unix 时间戳(在此之后将会恢复) | unint |

我们可以通过一个具体的项目是示例来结合官方文档以及 web3.0py 中来进行更深一步的了解:

```python
pancakeswap2_txn = router_contract.functions.swapExactTokensForTokens(
buy_value,
slippage, # set to 0, or specify minimum amount of tokeny you want to receive - consider decimals!!!
[value_type_address, pair_type_address, tokenToBuy],
sender_address,
(int(time.time()) + 10000)
).buildTransaction({
'from': sender_address,
'gas': int(gas),
'gasPrice': web3.toWei(str(gas_price), 'gwei'),
'nonce': nonce,
})

通过上述的 code 中我们可以看到基本上就是非常符合 swapExactTokensForTokens
所传入的参数,而之后的 .buildTransaction 方法是交易交易,指定合约调用并构建事务字典,包含了诸如 from 以及 gasnonce 等参数。

但在此之前我们可以知道 WETH 是 Address 的方法组,更多的我们可以参考官方文档给出的解释。

之后我们在 15581850 块内其中一个交易信息中,在其 Interacted With(To) 栏中,进入到该合约页面中,可以在其 Contract 内查看合约的具体信息以及合约的 Code 等。

同样的我们也可以在 Contract Source Code (Solidity) 栏中查看合约的源代码,具体的与 uniswap 都相差无几。

swapExactETHForTokens 以 ETH 为基准将 ETH 互换为 Tokens

通过 ETH 交换 token,在 Bsccan 中,由于套的 Ethscan 所以通过此方法交易的类型,也会在交易详情页中的 Value 内进行标注通过 BNB 交易的份额,例如 Binance Transaction Hash (Txhash) Details | BscScan中。

通过此方法进行交易,将会附带一个 payable 参数,用于可能、可以、或必须支付的费用,在其他非 Eth 交易的数据中,则不会将交易的数额写入到 Value 栏内。该方法的第一个参数必须是 WBNB 也就是 WBNB 的地址等,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
if value_type_address == 'BNB' and pair_type_address == wbnb:  
pancakeswap2_txn = router_contract.functions.swapExactETHForTokens(
0, # set to 0, or specify minimum amount of tokeny you want to receive - consider decimals!!!
[wbnb, tokenToBuy],
sender_address,
(int(time.time()) + 10000)
).buildTransaction({
'from': sender_address,
'value': buy_value, # This is the Token(BNB) amount you want to Swap from
'gas': int(gas),
'gasPrice': web3.toWei('12', 'gwei'),
'nonce': nonce,
})

在上述的 code 中,与 swapExactTokensForTokens 的区别之处在于 payable ,这个在 web3.0 的概述中,我们可以得知,payable 就是 value 只有通过 WBNB 进行交易的时候。

1
对于其他的方法,只要涉及 ```payable``` 变量,那么就表明这个东西是需要进行 BNB 交易份额的。

在此之前,我们需要了解下一个交易时的概念,就是滑点(Slippage) 也就是在交易的过程中来描述交易在等待时可能发生改变的属于,当交易被提交到 ETH 时,他们的执行顺序时根据 gas 数量来决定的(提供的 gas 费用越高,所执行的速度也就越快。在这其中他所最终交易的价格环境也会发生变化,因为加密货币的市值也是不断变化的)

滑点的容忍度他建立了一个用户可以所接受的超出价格影响的变化幅度,只要价格在滑点的范围内,那么交易就会被执行。

swapETHForExactTokens 以 Tokens 为基准来通过 ETH 来进行换取

我们可以看到同样是互换的交易类型,Binance Transaction Hash (Txhash) Details | BscScan 的交易类型和 swapExactTokensForTokens 的区别在于,之处可以看下方的图片介绍:

从上图可以得知,两个转换方法的不同指出在于,买入的方式不同,后者是通过 BNB 货币价值等价于 tokens 来进行买入 Tokens,而前者则是通过买入 tokens 数量来支付 BNB,一般来说 swapETHForExactTokens 会更加精准些许。

需要注意的是,按照 uniswap 的 function 命名规则,通常是 Exact 跟在谁的后面,那么就精准谁的数据信息,比如 Exacttoken 后面,那么他的数据就较为精准,反而毅然。

swapExactTokensForETH 准确地将 token 交换出 ETH

准确的将 token 交换出的 ETH,用于将一个接近整数的 token 互换为 ETH,并进行交易。

你可以通过 Binance Transaction Hash (Txhash) Details | BscScan 来查看真实的交易数据,之后通过 Web3 来进行 Swap 交易的进行。

⬅️ Go back